(計実) 第4回課題
今回は課題が4つある(一部はオプション).
まず回答用ファイルを作成し,それに記入しながら下記の課題に取り組みなさい.
回答用ファイル:Unix_Lesson04.txt
※回答用ファイルの編集は Unix のエディタ(nano / vi)を使って書くこと.
※作業中は,まめに保存 (セーブ) すること.
code:目次
◆課題04-1:ワイルドカード
◆課題04-2:1行コマンドを作る
◆課題04-3:1行コマンドの解析
◆課題04-4:Pythonでプログラム(1)
【提出方法】
◆課題04-1: ワイルドカード
※以下では,カレントディレクトリ=ホームディレクトリ( $HOME )とする.
【準備】
1.$HOME( ホームディレクトリ )にBackupという, バックアップ用のディレクトリが存在することを確認しなさい.
( 当然,Work, Reportと同じ階層 )
2.Work ディレクトリの中にファイル workfile1 ~ workfile6 が存在することを確認しなさい.
【問題】
Work 下の workfile1 ~ workfile6 の6個のファイルを,1回 ( 1行 ) のコマンド入力でBackup ディレクトリにコピーしたい.
ところが,人によって作業の進み具合ややり方が違うので,ディレクトリの状態が異なっている.
以下,仮に a, b, c という3人のユーザがいるとする.
この1人ずつの状態に応じて,上の要求になるべく簡易に実行できるコマンドを(1行で)答えなさい.
◎aさん:Work には workfile1 ~ workfile6 の6個しかない
= 他のファイルがない状況で,これら6個全部をコピー
◎bさん:Work には雑多なファイルが存在するが,"workfile"で始まるファイルは workfile1 ~ workfile6 の6個だけ
= workfileで始まるすべてのファイルをコピー
◎cさん:Work には雑多なファイルが存在しており,"workfile"で始まるファイルは workfile1 ~ workfile100 まである
= workfile100個の中から workfile1~6 の6個だけを取り出してコピー
※上記の aさん,bさん,cさんに対応したコマンドを,それぞれ回答しなさい.(相対パスでよい)
※注意(Hint)※
コピーのコマンドでは,複数のファイルを指定することができるので,もしディレクトリの状態が分からないならば、6つのファイルをすべて指定すれば一度にコピーすることができるが、それではキー入力がとても面倒である.そこで,少しでも簡単に(つまり1文字でも少なく)入力できるコマンドを考えようという課題である.
したがって,aさん,bさん,cさん,すべて答えが異なる.複数のファイルをどのように指定するかを工夫することになる.
複数のファイルを指定する方法は一つではない.'*' を使う方法,'?' を使う方法,'...'を使う方法. これらの方法を検討した上で,一番簡単に実行できるコマンドを選びなさい. たとえば,cさんの場合:ファイル名の頭に"workfile",その後に番号が続くパターンのファイルが100個あるわけだ.その中からworkfile1~workfile6 を明示的に指定する必要がある.
【回答】
aさん,bさん,cさんそれぞれのケースについて,コマンドを書きなさい.
◆課題04-2:1行コマンドを作る(オプションあり)
これは,(計実) 第3回課題 の続きである.コマンドをパイプで組み合わせて1行の大きなコマンドを作るという作業をしよう. 【準備】
まず,教材となるデータとして,ls コマンドの man page をテキストファイルとして保存する.
★作業:ls コマンドの man page をリダイレクトし,manpage.txt として保存しなさい. ← この作業ができなければ以下は全滅する
【問題】
manpage.txt に対して,次の手順 (1) ~ (5) すべての操作を,この順の通り, 適切なコマンド・フィルタ・パイプを組み合わせ, 1行のコマンドとして書き,その出力結果を書きなさい.
ただし,手順 (2) と手順 (3) はオプションとし,飛ばしてもよい.
※したがって手順 (4) は,手順 (1) ,(2) ,(3) のいずれかの後に続く.
手順 (1) manpage.txt の中から,"--" (半角ハイフン2つ) という記号の並びを検索する.
手順 (2) (オプション1) : 手順 (1) の結果を,tee コマンドを使って temp04.dat に保存し,処理を続ける.
手順 (3) (オプション2) : 手順 (1) または (2) に続けて 「半角空白連続7つ」の直後に「"-"以外の文字」を含む行を除外する.
手順 (4) 手順 (1) または (2) または (3) に続けて,大文字小文字の区別なく昇順に並べ替える.
手順 (5) 手順 (4) に続けて,第14~21行のみを出力する (2つのコマンドを組み合わせる) .
手順 (6) 手順 (5) の結果を result04.dat というファイルに保存する.
※ヒント※
いっぺんに答えを出そうとしないこと.
1. ひとつずつの手順について,その動作のためのコマンドを検討する
2. それに適切なオプションをつけて動作(機能)を確認する
3. それらをひとつずつ組み合わせて(つなげて)いく
4. 最後に1行コマンドとしてまとめる
それぞれのコマンドには適切なオプションをつける必要がある.
※各コマンドの man page を参考にすること (ネット検索OK)
手順 (1) の検索語は'--' (半角マイナスが2つ) である.
grep コマンドの仕様上,このままではうまく検索できない.こういう時は"クォート"する.
※クォートについては各自調べること
手順 (5) は,2つのコマンドをパイブでつないで組み合わせる.
※オプション部分のヒント※
(オプション1): すでに学んだように,Unix ではパイプ機能を使って, コマンドによる標準出力をパイプでつなげて,次々と処理を連続させることができる.
しかしある程度長い処理の場合,途中経過を確認したい場合がある.
この時,パイプを通して標準入力に入ったデータをコピーし,標準出力とファイルに分岐させ, 標準出力はそのままパイプに流すことができると便利 (一種のモニタリング) .
この機能をもつフィルタが tee コマンド.
※ 'tee'という名はアルファベットの'T',つまり「T字型に分岐する」という意味から
※ 詳細は'man tee'を参照.
(オプション2): これは検索文字表記の応用問題.例えば,
68: --group-directories-first
の行は検索にヒットするが,
11: のいずれも指定されず,……
の行はヒットしないように除外したい.それにはどうするか?
【回答】
1行にした「コマンド」と「出力結果」の両方を書くこと.
もし完成しなくても,できたところまでのコマンドとその結果を書きなさい.
◆課題04-3:1行コマンドの解析(Yet Another Option)
※Yet Another: さらにもうひとつの
この課題はすべてオプションである.
上で作成した manpage.txt を対象として,次の1行コマンドを作成した.
※複数行に分かれて見えるが,1行で記述されている
code:YetAntherProblem
cat manpage.txt | awk 'BEGIN{RS="";FS="\n"}{print $1 $2 $3}' | grep -e ' -' | sed -e 's/^ \+//g' -e 's/ \+/ /g' -e 's/, /,/' -e 's/ /:/' -e 's/ \+//g' -e 's/。.*//g' | grep -v '^\--' | awk 'BEGIN{FS=":"}{printf "%-29s | %s%s\n",$1,$2,$3}' | sort -f
【問題】
a.このコマンドの結果を示しなさい (上のコードをコピーしてよい) .
b.パイプで繋げられた各々のコマンドは,順にどんな作業をするのか, 解説しなさい.
※ヒント※
これはパイプを7つ使い,8つのコマンドをつなげて1行のコマンドにしてある.
それぞれのコマンドで何が起きているかは, 前から順番に試してみればわかる.
それぞれの段階の前と後の出力を比較すれば,推測はできるはず.
習っていないコマンド (sed, awk など) が登場する. これらについては man page や Web で調べなさい.簡単な説明は以下の通り.
sed: 標準入力に対し,行単位でテキストの置換 (sコマンド) などを一括実行するストリームエディタ.上の例では複数の変換を行っている.
awk: 行単位と列 (カラム) 単位でテキストパターン処理をする.
例:"aa bb cc" という半角スペースで区切られた行に対して, awk '{print $2}' を実行すると,"bb" が出力される.
【回答】
a.1行コマンドの結果を貼り付けなさい.
b.1行コマンドの動作解説を文章で書きなさい.
◆課題04-4:Pythonでプログラム(1)
【準備】
以下のプログラムがある.これを入力し,"lesson04-4.py" として,Workデイレクトリに保存しなさい.
★自力で入力すること.実行してみてどうしてもエラーがでる場合は,最後の手段としてコピーしても良いとする.
code:lesson04-4.py
# (1)
a="Hello"
b="world"
c=a+b
print( "(1) %s+%s=%s" % ( a,b,c ) )
# (2)
f=a*10
print( "(2) %s" % f )
# (3)
d=format( '(3) %s + %s' % (a,b) )
print( d )
# (4)
f=b.replace('world','UNIVERSE')
g=format( '(4) %s -> %s' % (b,f) )
print( g )
# (5)
print("(5)Before:\n%s" % h)
i=h.strip()
print("(5)After:\n%s" % i)
【問題】
a.このプログラムの出力を記録しなさい.入力と出力を明確に書くこと.
b.上記プログラム中の(1)から(5)は,出力(1)~(5)に対応している.それぞれ,何をしているのかを,説明せよ.
c.(オプション)プログラム中(1)のa,bに代入する文字列を自分独自のものに変更し,プログラムを実行し,出力を記録しなさい.
【回答】
a.入力文は"$"をつけておくこと.出力はどこからどこまでが出力されたのかを明記すること.
code:例:
入力:$ hogehoge hogeghoe.py
出力:----
output output output output output output
output output output output output output
:
------
b.やっていることをわかりやすく記述する.また関数が出てきたら簡単な説明をつける.
code:例:
lesson04-4.pyを解説する.
(1) XXXを○○○○に△△△して,それを▽▽し,print関数で出力している.
※print関数は…………するものである
(2) ………………
:
:
(5) ………………
※strip関数は…………
c.aになにを代入したか,bに何を代入したか明記してから,入力と出力をわかりやすく書く(問題a.のような書き方).
code:例:
代入文字列:a = こんにちは b = 龍谷太郎です
入力:$ …………
出力:-----
output output output output output output
:
------
【提出方法】
( 1 ) 上記 課題04-1~課題04-4 の回答を,Unix_Lesson04.txt として,レポートディレクトリ ( Report ) に保存する.
( 2 ) そして,Unix_Lesson04.txt の内容をコピーし,manaba レポートの入力画面に貼り付ける.(ファイル提出ではなく直接入力)
※貼り付けてからの編集も可能.ただし元のUnix_Lesson03.txt から大きく書き換えるなら,元を書き換えてからコピペするべき
※提出の際には「提出」ボタンを押し忘れないこと
( 3 ) 課題04-2の一部および課題04-3はオプション
( 4 ) レポートにおいて,各課題にはタイトルをつけて分かりやすくすること.
※課題番号と回答だけは✗.課題内容が分かる題名にする
提出場所 (1): レポートディレクトリ ( Report )
ファイル名: Unix_Lesson04.txt
提出場所 (2): manaba「情報基礎 U43Y314」
→ レポート「計算機実習1第4回レポート」
提出期限:次回の授業開始 (13:30)
※時間は厳守.
以上.
2023/7/6 by Kobori Satoshi, Fujii Daisuke